﻿<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8" />
    <title></title>
</head>
<body>
    <script>

        /* 1、使用 typeof 操作符来检测数据类型 */

        // 直接检测字面量
        console.log('字面量 1 的数据类型是：' + typeof 1);
        console.log('字面量 "Hello World!" 的数据类型是：' + typeof "Hello World!");
        console.log('字面量 true 的数据类型是：' + typeof true);
        console.log('字面量 {} 的数据类型是：' + typeof {});
        console.log('字面量 null 的数据类型是：' + typeof null); // 注意：null 的数据类型是 object

        // 检测变量
        var val1 = 1, val2 = 'Hello World!', val3 = true, val4 = {}, val5 = null, val6;
        console.log('变量 val1 的值是：' + val1 + '，数据类型是：' + typeof val1);
        console.log('变量 val2 的值是：' + val2 + '，数据类型是：' + typeof val2);
        console.log('变量 val3 的值是：' + val3 + '，数据类型是：' + typeof val3);
        console.log('变量 val4 的值是：' + val4 + '，数据类型是：' + typeof val4);
        console.log('变量 val5 的值是：' + val5 + '，数据类型是：' + typeof val5);  // 注意：null 的数据类型是 object
        console.log('变量 val6 只声明未初始化，数据类型是：' + typeof val6);        // 注意：未赋值的变量 它的值是 undefined 数据类型也是 undefined
        console.log('变量 val7 未声明，数据类型是：' + typeof val7);                // 注意：未声明的变量，不能拿来使用，否则可能出现错误；但是可以使用 typeof 来检测它的类型，它的类型是 undefined

        /* 数据类型 */
        // undefined 是未声明，或者只声明，未赋值的变量的类型
        // null 严格的来说不是一个数据类型，只不是过 object 的一个特殊的值。因为 typeof 检测 null 的时候，返回的结果是 object
        // null == undefined 但是 typeof != undefined

        // number 是数字类型，不区分整形浮点型 
        // number 的其它进制的字面量表示方法

        // 2进制表示方法 var n1 = 0b0010; // 0b开头，后面跟0或1
        // 8进制表示方法 var n2 = 0o1743; // 0o开头，后面跟0-7的数字
        // 16进制表示方法 var n3 = 0x0A3C; // 0x开头，后面0-9的数字及 A-F 的字母
        // 进制只在初始化赋值的时候有效（作为字面量的时候的一种表示方法而已），赋值之后，js引擎里边存储的都是 10 进制数字
        // 也就是说 你把 0x000f 保存到变量里，那变量里保存的其实是 16 这个10 进制数字而已。
        // 还有一种情况比较特殊 就是不要这样初始一个变量 var n1 = 056;  这样的话，字面量056代表的不是56 而是8进制的56。
        console.log('字面量 0b1110 的值是：' + 0b1110);
        console.log('字面量 0o1110 的值是：' + 0o1110);
        console.log('字面量 0x1110 的值是：' + 0x1110);

        // 使用的时候要注意 0.1 + 0.2 != 0.3
        // 如果想检测小数的计算结果，是否相等，一般是取一定的有效数字后，再进行比较
        // Number 取有效数字的方法是 Number.toFixed(n)，那计算的返回结果是一个字符串
        // 也通常叫数字格式化输出
        // toFixed(n) 里边要传一个参数，代表了您要保留几位有效数字
        var n1 = 0.1, n2 = 0.2, n3 = 0.3;
        console.log('n1 + n2 的值是：' + (n1 + n2));
        console.log('n3 的值是：' + n3);
        console.log('n1 + n2 == n3 的计算结果是：' + (n1 + n2 == n3));   // 这是是 false ，因为计算精度的关系，所有会出现一个非常小的误差
        console.log('(n1 + n2).toFixed(3) == n3.toFixed(3) 的计算结果是：' + ((n1 + n2).toFixed(3) == n3.toFixed(3)));
        // 这种比较就是相等的了：
        // 0.1+0.2 然后 toFixed(3) 结果是字符串 “0.300”
        // n3.toFixed(3) 结果也是字符串 “0.300”
    </script>
</body>
</html>